package com.king.juc.n8.threadpooldemo.threadpool;

import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.TimeUnit;

import static com.king.juc.utils.ThreadUtil.sleep;

/**
 * 线程池
 *  CPU 密集型运算
 *      通常采用 CPU核数 + 1 能够实现最优的 CPU 利用率, +1 是保证当线程由于页缺失故障(操作系统)或其他原因导致暂停时,
 *      额外的这个线程就能顶上去, 保证 CPU 时钟周期不被浪费
 *
 *  I/O 密集型运算
 *      线程数 = 核数 * 期望CPU利用率 * 总时间(CPU计算时间 + 等待时间) / CPU计算时间
 *      例如: 4核CPU计算时间是50%, 其他等待时间是50%, 期望CPU被100%利用 -> 4 * 100% * 100% / 50% = 8
 * @author king
 * @date 2020/12/7 22:28
 */
@Slf4j(topic = "c.ThreadPoolDemo")
public class ThreadPoolDemo {
    public static void main(String[] args) {
        ThreadPool threadPool = new ThreadPool(1, 1,  1000, TimeUnit.MILLISECONDS, (queue, task) -> {
            // 1) 死等
//            queue.put(task);
            // 2) 带超时等待
//            queue.offer(task, 1500, TimeUnit.MILLISECONDS);
            // 3) 让调用者放弃任务执行
//            log.debug("放弃 {}", task);
            // 4) 让调用者抛出异常
//            throw new RuntimeException("任务执行失败" + task);
            // 5) 让调用者自己执行任务
            task.run();
        });
        for (int i = 0; i < 3; i++) {
            int j = i;
            threadPool.execute(() -> {
                log.debug("{}", j);
                sleep(1);
            });
        }
    }
}
